/* 
 * File:   move.h
 * Author: tomas
 *
 * Created on March 28, 2009, 8:45 PM
 */

#pragma once
#ifndef _MOVE_H
#define _MOVE_H

#include <string>
#include <ostream>

#include "horse.h"
#include "utils.h"


//V kodu spoleham na to, ze platne tahy maji cisla 1 az 8. Nemenit!
enum Direction {
	NONE, //nedoslo k pohybu..jezdec zustal na miste..
	LLU = 1,
	RUU,
	RRU,
	LUU,
	RRD,
	LLD,
	LDD,
	RDD = 8
};
std::string directionToString(Direction dir)
{
	switch (dir)
	{
	case NONE:
		return "NONE";
	case LLU:
		return "LLU";
	case LLD:
		return "LLD";
	case RRU:
		return "RRU";
	case RRD:
		return "RRD";
	case LUU:
		return "LUU";
	case LDD:
		return "LDD";
	case RUU:
		return "RUU";
	case RDD:
		return "RDD";
	default:
		throw "hapalo";
	}
	
}
struct Move {

	utils::coords_t origCoords;
	utils::coords_t targetCoords;
	Direction dir;

	//////////////////////////////////////////////////////////////////////////
	//Ctor.
	Move(const size_t origX, const size_t origY, const Direction _dir) : dir(_dir)
	{
		origCoords.first = origX;
		origCoords.second = origY;
		targetCoords = makeMove(origCoords, _dir);
	}

	//////////////////////////////////////////////////////////////////////////
	//Ctor.
	Move(const utils::coords_t _c, const Direction _dir): dir(_dir)
	{
		origCoords = _c;
		targetCoords = makeMove(_c, _dir);
	}

	//////////////////////////////////////////////////////////////////////////
	//Printout
	friend std::ostream& operator<< (std::ostream& os, const Move& m)
	{
		using namespace utils;
		os << m.origCoords << "->" << m.targetCoords;
		
		return os;
	}

private:

	//////////////////////////////////////////////////////////////////////////
	//Pomocna metoda, vypocita cilove souradnice ze zadanych zdrojovych a zadaneho smeru.
	static utils::coords_t makeMove(const utils::coords_t &origCoords, const Direction & dir)
	{
		utils::coords_t targetCoords;
		switch (dir)
		{
		case LLU:
			targetCoords = utils::coords_t(origCoords.first-2,origCoords.second-1);
			break;
		case LLD:
			targetCoords = utils::coords_t(origCoords.first-2,origCoords.second+1);
			break;
		case LUU:
			targetCoords = utils::coords_t(origCoords.first-1,origCoords.second-2);
			break;
		case LDD:
			targetCoords = utils::coords_t(origCoords.first-1,origCoords.second+2);
			break;
		case RRU:
			targetCoords = utils::coords_t(origCoords.first+2,origCoords.second-1);
			break;
		case RRD:
			targetCoords = utils::coords_t(origCoords.first+2,origCoords.second+1);
			break;
		case RUU:
			targetCoords = utils::coords_t(origCoords.first+1,origCoords.second-2);
			break;
		case RDD:
			targetCoords = utils::coords_t(origCoords.first+1,origCoords.second+2);
			break;
		default:
			throw "Neznamy smer.";
		}
		return targetCoords;
	}
};

#endif	/* _MOVE_H */
